package com.jl15988.pguard.util;

import java.io.IOException;
import java.net.Socket;

/**
 * 进程工具类
 *
 * @author jl15988
 * @since 2025/1/15 16:28
 **/
public class ProcessUtil {

    /**
     * 检查端口是否可用
     * <p>
     * 尝试在指定端口创建Socket连接，以检查端口是否可用。
     * </p>
     *
     * @param port 要检查的端口号
     * @return 端口是否可用
     */
    public static boolean testPortHealth(int port) {
        try (Socket ignored = new Socket("localhost", port)) {
            return true;
        } catch (IOException ignored) {
            return false;
        }
    }

    /**
     * 获取进程ID
     *
     * @param process 进程对象
     * @return 进程ID
     */
    public static long getPid(Process process) throws Exception {
        if (process == null) {
            return -1;
        }
        try {
            // 尝试使用 Process.pid() (Java 9+)
            java.lang.reflect.Method pidMethod = Process.class.getMethod("pid");
            return (long) pidMethod.invoke(process);
        } catch (Exception e) {
            // 尝试使用反射获取进程ID (Java 8)
            java.lang.reflect.Field field = process.getClass().getDeclaredField("handle");
            field.setAccessible(true);
            return (long) field.get(process);
        }
    }
}
